Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ

Node / meshtastic / Meshtastic-Android / files / scripts / sync-android-docs.js

Displaying Raw β€’ Download

scripts/sync-android-docs.js feat/unknown-node-incomplete-badge (94b513a4) Text, 20.16 KB

T8b949e#!/usr/bin/env node
T8b949e// scripts/sync-android-docs.js
T8b949e// Transforms Android in-app docs for publishing on the meshtastic.org Docusaurus site.
T8b949e//
T8b949e// Usage: node scripts/sync-android-docs.js <android-repo-path> [--convert-webp] [--dry-run]
T8b949e//
T8b949e// <android-repo-path> Path to a clone of meshtastic/Meshtastic-Android (or omit to
T8b949e// auto-detect from this script's location in the repo).
T8b949e// --convert-webp Convert PNG/JPG/JPEG/GIF images to WebP via cwebp and rewrite
T8b949e// all image references in Markdown to use .webp. Requires cwebp on PATH.
T8b949e// --dry-run Print what would be written without actually writing files.
T8b949e//
T8b949e// Output structure (relative to CWD, typically the meshtastic/meshtastic repo root):
T8b949e// docs/software/android/user/*.md
T8b949e// docs/software/android/developer/*.md
T8b949e// docs/software/android/index.md
T8b949e// static/img/android/docs/*.webp (or .png/.svg if not converting)
T8b949e//
T8b949e// Only screenshots a synced page actually references are published; any other
T8b949e// file already under those two directories is pruned at the end of the run.

Ta5d6ff"use strict"Tb4b4b4;

Tff7b72const Te6edf3fs Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"fs"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3path Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"path"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{ Te6edf3execSync Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"child_process"Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4{ Te6edf3discoverSlugs Tb4b4b4} Tff7b72= Te6edf3requireTb4b4b4(Ta5d6ff"./lib/frontmatter"Tb4b4b4)Tb4b4b4;

T8b949e// ── Configuration ────────────────────────────────────────────────────────────

Tff7b72const Te6edf3args Tff7b72= Te6edf3processTb4b4b4.Te6edf3argvTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3CONVERT_WEBP Tff7b72= Te6edf3argsTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"--convert-webp"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3DRY_RUN Tff7b72= Te6edf3argsTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"--dry-run"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3positionalArgs Tff7b72= Te6edf3argsTb4b4b4.Te6edf3filterTb4b4b4(Te6edf3a Tb4b4b4=> Tff7b72!Te6edf3aTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"--"Tb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3WEBP_CONVERTIBLE Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4[Ta5d6ff".png"Tb4b4b4, Ta5d6ff".jpg"Tb4b4b4, Ta5d6ff".jpeg"Tb4b4b4, Ta5d6ff".gif"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3IMAGE_EXTENSIONS Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4[Ta5d6ff".png"Tb4b4b4, Ta5d6ff".jpg"Tb4b4b4, Ta5d6ff".jpeg"Tb4b4b4, Ta5d6ff".gif"Tb4b4b4, Ta5d6ff".svg"Tb4b4b4, Ta5d6ff".webp"Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// Resolve source: explicit path argument, or auto-detect from script location
Tff7b72const Te6edf3ANDROID_REPO_ROOT Tff7b72= Te6edf3positionalArgsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0
Tff7b72? Te6edf3pathTb4b4b4.Te6edf3resolveTb4b4b4(Te6edf3positionalArgsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72: Te6edf3pathTb4b4b4.Te6edf3resolveTb4b4b4(Te6edf3__dirnameTb4b4b4, Ta5d6ff".."Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3SRC_DOCS_DIR Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3ANDROID_REPO_ROOTTb4b4b4, Ta5d6ff"docs"Tb4b4b4, Ta5d6ff"en"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3SRC_SCREENSHOTS_DIR Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3ANDROID_REPO_ROOTTb4b4b4, Ta5d6ff"docs"Tb4b4b4, Ta5d6ff"assets"Tb4b4b4, Ta5d6ff"screenshots"Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3SRC_DOCS_DIRTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff`Ta5d6ffError: docs directory not found at Tffd700${Te6edf3SRC_DOCS_DIRTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Usage: node sync-android-docs.js <android-repo-path> [--convert-webp] [--dry-run]"Tb4b4b4)Tb4b4b4;
Te6edf3processTb4b4b4.Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// Output directories (relative to CWD, which should be the meshtastic/meshtastic repo)
Tff7b72const Te6edf3DEST_DOCS_DIR Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"docs"Tb4b4b4, Ta5d6ff"software"Tb4b4b4, Ta5d6ff"android"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3DEST_IMAGES_DIR Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"static"Tb4b4b4, Ta5d6ff"img"Tb4b4b4, Ta5d6ff"android"Tb4b4b4, Ta5d6ff"docs"Tb4b4b4)Tb4b4b4;

T8b949e// Derive sibling page slugs from the filesystem (no manual sync needed)
Tff7b72const Te6edf3KNOWN_USER_SLUGS Tff7b72= Te6edf3discoverSlugsTb4b4b4(Te6edf3SRC_DOCS_DIRTb4b4b4, Ta5d6ff"user"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3KNOWN_DEV_SLUGS Tff7b72= Te6edf3discoverSlugsTb4b4b4(Te6edf3SRC_DOCS_DIRTb4b4b4, Ta5d6ff"developer"Tb4b4b4)Tb4b4b4;

T8b949e// ── Helpers ──────────────────────────────────────────────────────────────────

Tff7b72function Te6edf3ensureDirTb4b4b4(Te6edf3dirTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3DRY_RUNTb4b4b4) Tb4b4b4{
Te6edf3fsTb4b4b4.Te6edf3mkdirSyncTb4b4b4(Te6edf3dirTb4b4b4, Tb4b4b4{ Te6edf3recursiveTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72function Te6edf3writeFileTb4b4b4(Te6edf3filePathTb4b4b4, Te6edf3contentTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3DRY_RUNTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ff[dry-run] Would write: Tffd700${Te6edf3filePathTffd700}Ta5d6ff (Tffd700${Te6edf3BufferTb4b4b4.Te6edf3byteLengthTb4b4b4(Te6edf3contentTb4b4b4)Tffd700}Ta5d6ff bytes)Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ensureDirTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3dirnameTb4b4b4(Te6edf3filePathTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3fsTb4b4b4.Te6edf3writeFileSyncTb4b4b4(Te6edf3filePathTb4b4b4, Te6edf3contentTb4b4b4, Ta5d6ff"utf-8"Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffWrote: Tffd700${Te6edf3filePathTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72function Te6edf3copyFileTb4b4b4(Te6edf3srcTb4b4b4, Te6edf3destTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3DRY_RUNTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ff[dry-run] Would copy: Tffd700${Te6edf3srcTffd700}Ta5d6ff β†’ Tffd700${Te6edf3destTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ensureDirTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3dirnameTb4b4b4(Te6edf3destTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3fsTb4b4b4.Te6edf3copyFileSyncTb4b4b4(Te6edf3srcTb4b4b4, Te6edf3destTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffCopied: Tffd700${Te6edf3destTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Rewrite image references in markdown to point to /img/android/docs/<file>.
* When --convert-webp, convertible extensions become .webp.
*/
Tff7b72function Te6edf3rewriteImagePathsTb4b4b4(Te6edf3contentTb4b4b4) Tb4b4b4{
Tff7b72function Te6edf3destBasenameTb4b4b4(Te6edf3imgPathTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3base Tff7b72= Te6edf3pathTb4b4b4.Te6edf3basenameTb4b4b4(Te6edf3imgPathTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ext Tff7b72= Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3baseTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3CONVERT_WEBP Tff7b72&& Te6edf3WEBP_CONVERTIBLETb4b4b4.Te6edf3hasTb4b4b4(Te6edf3extTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3baseTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72-Te6edf3extTb4b4b4.Te6edf3lengthTb4b4b4) Tff7b72+ Ta5d6ff".webp"Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3baseTb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3content
Tb4b4b4.Te6edf3replaceTb4b4b4(
Ta5d6ff/!\[([^\]]*)\]\((?!https?:\/\/)(?!\/img\/)([^)]+)\)/gTb4b4b4,
Tb4b4b4(Te6edf3matchTb4b4b4, Te6edf3altTb4b4b4, Te6edf3imgPathTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3ext Tff7b72= Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3basenameTb4b4b4(Te6edf3imgPathTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3IMAGE_EXTENSIONSTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3extTb4b4b4)Tb4b4b4) Tff7b72return Te6edf3matchTb4b4b4;
Tff7b72return Ta5d6ff`Ta5d6ff![Tffd700${Te6edf3altTffd700}Ta5d6ff](/img/android/docs/Tffd700${Te6edf3destBasenameTb4b4b4(Te6edf3imgPathTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3replaceTb4b4b4(
Ta5d6ff/<img\s+([^>]*?)src=["'](?!https?:\/\/)(?!\/img\/)([^"']+)["']([^>]*)>/giTb4b4b4,
Tb4b4b4(Te6edf3matchTb4b4b4, Te6edf3beforeTb4b4b4, Te6edf3imgPathTb4b4b4, Te6edf3afterTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3ext Tff7b72= Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3basenameTb4b4b4(Te6edf3imgPathTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3IMAGE_EXTENSIONSTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3extTb4b4b4)Tb4b4b4) Tff7b72return Te6edf3matchTb4b4b4;
Tff7b72return Ta5d6ff`Ta5d6ff<img Tffd700${Te6edf3beforeTffd700}Ta5d6ffsrc="/img/android/docs/Tffd700${Te6edf3destBasenameTb4b4b4(Te6edf3imgPathTb4b4b4)Tffd700}Ta5d6ff"Tffd700${Te6edf3afterTffd700}Ta5d6ff>Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Rewrite relative markdown links between sibling pages.
* e.g., `[text](connections)` β†’ `[text](connections.md)`
* e.g., `[text](../developer/testing)` β†’ `[text](../developer/testing.md)`
*/
Tff7b72function Te6edf3rewriteSiblingLinksTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3sectionTb4b4b4, Te6edf3isIndex Tff7b72= Tff7b72falseTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3slugs Tff7b72= Te6edf3section Tff7b72=== Ta5d6ff"user" Tff7b72? Te6edf3KNOWN_USER_SLUGS Tff7b72: Te6edf3KNOWN_DEV_SLUGSTb4b4b4;

T8b949e// Match [text](link) where link is NOT an absolute URL, NOT an anchor, NOT already .md
Tff7b72return Te6edf3contentTb4b4b4.Te6edf3replaceTb4b4b4(
Ta5d6ff/\[([^\]]*)\]\((?!https?:\/\/)(?!#)([^)]+)\)/gTb4b4b4,
Tb4b4b4(Te6edf3matchTb4b4b4, Te6edf3textTb4b4b4, Te6edf3linkTb4b4b4) Tb4b4b4=> Tb4b4b4{
T8b949e// Split off a trailing #anchor (or ?query) so it survives the .md rewrite.
T8b949e// Source links like `node-metrics#air-quality-metrics` must become
T8b949e// `node-metrics.md#air-quality-metrics`, else Docusaurus resolves the slug
T8b949e// as a sub-path of the current page and the build fails on a broken link.
Tff7b72const Te6edf3splitIdx Tff7b72= Te6edf3linkTb4b4b4.Te6edf3searchTb4b4b4(Ta5d6ff/[#?]/Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3linkPath Tff7b72= Te6edf3splitIdx Tff7b72>= T79c0ff0 Tff7b72? Te6edf3linkTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3splitIdxTb4b4b4) Tff7b72: Te6edf3linkTb4b4b4;
Tff7b72const Te6edf3suffix Tff7b72= Te6edf3splitIdx Tff7b72>= T79c0ff0 Tff7b72? Te6edf3linkTb4b4b4.Te6edf3sliceTb4b4b4(Te6edf3splitIdxTb4b4b4) Tff7b72: Ta5d6ff""Tb4b4b4;

T8b949e// Skip if already has .md extension or is an image
Tff7b72if Tb4b4b4(Te6edf3linkPathTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff".md"Tb4b4b4) Tff7b72|| Te6edf3IMAGE_EXTENSIONSTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3linkPathTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3matchTb4b4b4;
Tb4b4b4}

T8b949e// Section landing page (user/index.md, developer/index.md): the source
T8b949e// user.md/developer.md sit beside the section dir, so they link to children
T8b949e// as "user/onboarding". From index.md inside that dir, strip the prefix.
Tff7b72if Tb4b4b4(Te6edf3isIndexTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3sameSection Tff7b72= Te6edf3linkPathTb4b4b4.Te6edf3matchTb4b4b4(Tff7b72new Tffa657RegExpTb4b4b4(Ta5d6ff`Ta5d6ff^Tffd700${Te6edf3sectionTffd700}Ta5d6ff/(.+)Ta5d6ff`Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sameSection Tff7b72&& Te6edf3slugsTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3sameSectionTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Ta5d6ff[Tffd700${Te6edf3textTffd700}Ta5d6ff](Tffd700${Te6edf3sameSectionTb4b4b4[T79c0ff1Tb4b4b4]Tffd700}Ta5d6ff.mdTffd700${Te6edf3suffixTffd700}Ta5d6ff)Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Check for cross-section links like ../developer/testing
Tff7b72const Te6edf3crossMatch Tff7b72= Te6edf3linkPathTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/^\.\.\/(\w+)\/(.+)/Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3crossMatchTb4b4b4) Tb4b4b4{
Tff7b72const Tb4b4b4[Tb4b4b4, Te6edf3targetSectionTb4b4b4, Te6edf3slugTb4b4b4] Tff7b72= Te6edf3crossMatchTb4b4b4;
Tff7b72const Te6edf3targetSlugs Tff7b72= Te6edf3targetSection Tff7b72=== Ta5d6ff"user" Tff7b72? Te6edf3KNOWN_USER_SLUGS Tff7b72: Te6edf3KNOWN_DEV_SLUGSTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3targetSlugsTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3slugTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Ta5d6ff[Tffd700${Te6edf3textTffd700}Ta5d6ff](../Tffd700${Te6edf3targetSectionTffd700}Ta5d6ff/Tffd700${Te6edf3slugTffd700}Ta5d6ff.mdTffd700${Te6edf3suffixTffd700}Ta5d6ff)Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Check for sibling links
Tff7b72const Te6edf3bare Tff7b72= Te6edf3linkPathTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff/^\.\//Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3slugsTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3bareTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Ta5d6ff[Tffd700${Te6edf3textTffd700}Ta5d6ff](Tffd700${Te6edf3bareTffd700}Ta5d6ff.mdTffd700${Te6edf3suffixTffd700}Ta5d6ff)Ta5d6ff`Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3matchTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Transform Jekyll/kramdown frontmatter to Docusaurus-compatible format.
* Strips `parent`, `aliases`, and remaps `nav_order` to `sidebar_position`.
*/
Tff7b72function Te6edf3transformFrontmatterTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3sectionTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3fmMatch Tff7b72= Te6edf3contentTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/^---\n([\s\S]*?)\n---\n/Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fmMatchTb4b4b4) Tff7b72return Te6edf3contentTb4b4b4;

Tff7b72const Te6edf3fmBlock Tff7b72= Te6edf3fmMatchTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3body Tff7b72= Te6edf3contentTb4b4b4.Te6edf3sliceTb4b4b4(Te6edf3fmMatchTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3lines Tff7b72= Te6edf3fmBlockTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3newLines Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72let Te6edf3sidebarPosition Tff7b72= Tff7b72nullTb4b4b4;

Tff7b72for Tb4b4b4(Tff7b72const Te6edf3line Tff7b72of Te6edf3linesTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3trimmed Tff7b72= Te6edf3lineTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// Skip Jekyll-specific fields
Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"parent:"Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"aliases:"Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"- "Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4; T8b949e// alias list items

T8b949e// Remap nav_order β†’ sidebar_position
Tff7b72const Te6edf3navMatch Tff7b72= Te6edf3trimmedTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/^nav_order:\s*(\d+)/Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3navMatchTb4b4b4) Tb4b4b4{
Te6edf3sidebarPosition Tff7b72= Te6edf3navMatchTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3newLinesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffsidebar_position: Tffd700${Te6edf3sidebarPositionTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4) Te6edf3newLinesTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// Add parent reference for Docusaurus category
Tff7b72const Te6edf3parentTitle Tff7b72= Te6edf3section Tff7b72=== Ta5d6ff"user" Tff7b72? Ta5d6ff"User Guide" Tff7b72: Ta5d6ff"Developer Guide"Tb4b4b4;
Te6edf3newLinesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffparent: Tffd700${Te6edf3parentTitleTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;

Tff7b72return Ta5d6ff`Ta5d6ff---Ta5d6ff\nTffd700${Te6edf3newLinesTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tffd700}Ta5d6ff\nTa5d6ff---Ta5d6ff\nTffd700${Te6edf3bodyTffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Convert Jekyll-style callouts to Docusaurus admonitions.
* > **Tip β€” text** β†’ :::tip\ntext\n:::
*/
Tff7b72function Te6edf3convertCalloutsTb4b4b4(Te6edf3contentTb4b4b4) Tb4b4b4{
T8b949e// Match blockquotes starting with **Tip/Note/Warning β€”
Tff7b72return Te6edf3contentTb4b4b4.Te6edf3replaceTb4b4b4(
Ta5d6ff/^(> \*\*(Tip|Note|Warning)\s*[—–-]\s*)([^*]*)\*\*\s*([\s\S]*?)(?=\n(?!>)|$)/gmTb4b4b4,
Tb4b4b4(Te6edf3matchTb4b4b4, Te6edf3prefixTb4b4b4, Te6edf3typeTb4b4b4, Te6edf3titleTb4b4b4, Te6edf3bodyTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3admonitionType Tff7b72= Te6edf3typeTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3cleanBody Tff7b72= Te6edf3bodyTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff/^>\s?/gmTb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3fullContent Tff7b72= Te6edf3titleTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4) Tff7b72? Ta5d6ff`Tffd700${Te6edf3titleTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff Tffd700${Te6edf3cleanBodyTffd700}Ta5d6ff` Tff7b72: Te6edf3cleanBodyTb4b4b4;
Tff7b72return Ta5d6ff`Ta5d6ff:::Tffd700${Te6edf3admonitionTypeTffd700}Ta5d6ff\nTffd700${Te6edf3fullContentTffd700}Ta5d6ff\nTa5d6ff:::Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// ── Main ─────────────────────────────────────────────────────────────────────

T8b949e/**
* Collect the `/img/android/docs/<name>` basenames a page references, so only
* screenshots some page actually shows get published. Runs on the transformed
* content, which has already had relative paths rewritten to the site path and
* convertible extensions renamed to .webp β€” so these are destination names.
*/
Tff7b72function Te6edf3collectImageReferencesTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3intoTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3re Tff7b72= Ta5d6ff/\/img\/android\/docs\/([^)"'\s>]+)/gTb4b4b4;
Tff7b72let Te6edf3matchTb4b4b4;
Tff7b72while Tb4b4b4(Tb4b4b4(Te6edf3match Tff7b72= Te6edf3reTb4b4b4.Te6edf3execTb4b4b4(Te6edf3contentTb4b4b4)Tb4b4b4) Tff7b72!== Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3intoTb4b4b4.Te6edf3addTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3basenameTb4b4b4(Te6edf3matchTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72function Te6edf3processMarkdownTb4b4b4(Te6edf3srcPathTb4b4b4, Te6edf3destPathTb4b4b4, Te6edf3sectionTb4b4b4, Te6edf3isIndex Tff7b72= Tff7b72falseTb4b4b4, Te6edf3referencedImages Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3content Tff7b72= Te6edf3fsTb4b4b4.Te6edf3readFileSyncTb4b4b4(Te6edf3srcPathTb4b4b4, Ta5d6ff"utf-8"Tb4b4b4)Tb4b4b4;
Te6edf3content Tff7b72= Te6edf3transformFrontmatterTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3sectionTb4b4b4)Tb4b4b4;
Te6edf3content Tff7b72= Te6edf3rewriteImagePathsTb4b4b4(Te6edf3contentTb4b4b4)Tb4b4b4;
Te6edf3content Tff7b72= Te6edf3rewriteSiblingLinksTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3sectionTb4b4b4, Te6edf3isIndexTb4b4b4)Tb4b4b4;
Te6edf3content Tff7b72= Te6edf3convertCalloutsTb4b4b4(Te6edf3contentTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3referencedImagesTb4b4b4) Te6edf3collectImageReferencesTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3referencedImagesTb4b4b4)Tb4b4b4;
Te6edf3writeFileTb4b4b4(Te6edf3destPathTb4b4b4, Te6edf3contentTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Sync screenshots, returning the set of destination basenames written.
*
* Only images `referenced` by a synced page are published. The source
* screenshots directory accumulates captures faster than pages cite them (and
* the Compose screenshot tests regenerate the whole set), so copying it
* wholesale ships assets no page shows. Anything skipped here is absent from
* the returned set, which is what pruneStale() deletes against β€” so a
* screenshot that loses its last reference is removed from the site on the
* next sync rather than lingering forever.
*/
Tff7b72function Te6edf3processImagesTb4b4b4(Te6edf3referencedTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3written Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3SRC_SCREENSHOTS_DIRTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"No screenshots directory found, skipping image sync."Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3writtenTb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3images Tff7b72= Te6edf3fsTb4b4b4.Te6edf3readdirSyncTb4b4b4(Te6edf3SRC_SCREENSHOTS_DIRTb4b4b4)
Tb4b4b4.Te6edf3filterTb4b4b4(Te6edf3f Tb4b4b4=> Te6edf3IMAGE_EXTENSIONSTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3fTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;

Tff7b72let Te6edf3skipped Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3img Tff7b72of Te6edf3imagesTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3srcPath Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3SRC_SCREENSHOTS_DIRTb4b4b4, Te6edf3imgTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3ext Tff7b72= Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3destName Tff7b72= Te6edf3CONVERT_WEBP Tff7b72&& Te6edf3WEBP_CONVERTIBLETb4b4b4.Te6edf3hasTb4b4b4(Te6edf3extTb4b4b4)
Tff7b72? Te6edf3imgTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72-Te6edf3extTb4b4b4.Te6edf3lengthTb4b4b4) Tff7b72+ Ta5d6ff".webp"
Tff7b72: Te6edf3imgTb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3referencedTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3destNameTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3skippedTff7b72++Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3CONVERT_WEBP Tff7b72&& Te6edf3WEBP_CONVERTIBLETb4b4b4.Te6edf3hasTb4b4b4(Te6edf3extTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3destPath Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_IMAGES_DIRTb4b4b4, Te6edf3destNameTb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3DRY_RUNTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ff[dry-run] Would convert: Tffd700${Te6edf3srcPathTffd700}Ta5d6ff β†’ Tffd700${Te6edf3destPathTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3writtenTb4b4b4.Te6edf3addTb4b4b4(Te6edf3destNameTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ensureDirTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3dirnameTb4b4b4(Te6edf3destPathTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3execSyncTb4b4b4(Ta5d6ff`Ta5d6ffcwebp -q 80 "Tffd700${Te6edf3srcPathTffd700}Ta5d6ff" -o "Tffd700${Te6edf3destPathTffd700}Ta5d6ff"Ta5d6ff`Tb4b4b4, Tb4b4b4{ Te6edf3stdioTff7b72: Ta5d6ff"pipe" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffConverted: Tffd700${Te6edf3destPathTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3writtenTb4b4b4.Te6edf3addTb4b4b4(Te6edf3destNameTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff`Ta5d6ffFailed to convert Tffd700${Te6edf3imgTffd700}Ta5d6ff: Tffd700${Te6edf3errTb4b4b4.Te6edf3messageTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
T8b949e// Fall back to copying the original
Te6edf3copyFileTb4b4b4(Te6edf3srcPathTb4b4b4, Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_IMAGES_DIRTb4b4b4, Te6edf3imgTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3writtenTb4b4b4.Te6edf3addTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3copyFileTb4b4b4(Te6edf3srcPathTb4b4b4, Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_IMAGES_DIRTb4b4b4, Te6edf3imgTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3writtenTb4b4b4.Te6edf3addTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3skipped Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffSkipped Tffd700${Te6edf3skippedTffd700}Ta5d6ff screenshot(s) no synced page references.Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// A page citing an image that isn't in the source directory renders a broken
T8b949e// image on the site. Cheap to surface here, where both sets are in hand.
Tff7b72const Te6edf3missing Tff7b72= Tb4b4b4[Tb4b4b4...Te6edf3referencedTb4b4b4]Tb4b4b4.Te6edf3filterTb4b4b4(Te6edf3name Tb4b4b4=> Tff7b72!Te6edf3writtenTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3sortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3name Tff7b72of Te6edf3missingTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3warnTb4b4b4(Ta5d6ff`Ta5d6ffWarning: referenced image has no source screenshot: Tffd700${Te6edf3nameTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3writtenTb4b4b4;
Tb4b4b4}

T8b949e/** Recursively collect files under a directory, as paths relative to it. */
Tff7b72function Te6edf3collectFilesTb4b4b4(Te6edf3dirTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3results Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3dirTb4b4b4)Tb4b4b4) Tff7b72return Te6edf3resultsTb4b4b4;
Tb4b4b4(Tff7b72function Te6edf3walkTb4b4b4(Te6edf3currentTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3entry Tff7b72of Te6edf3fsTb4b4b4.Te6edf3readdirSyncTb4b4b4(Te6edf3currentTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3full Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3currentTb4b4b4, Te6edf3entryTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3fsTb4b4b4.Te6edf3statSyncTb4b4b4(Te6edf3fullTb4b4b4)Tb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3walkTb4b4b4(Te6edf3fullTb4b4b4)Tb4b4b4;
Tff7b72else Te6edf3resultsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3relativeTb4b4b4(Te6edf3dirTb4b4b4, Te6edf3fullTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4(Te6edf3dirTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3resultsTb4b4b4;
Tb4b4b4}

T8b949e/**
* Remove destination files this run did not produce, so renamed or deleted
* source pages (and the screenshots they referenced) don't linger on the site.
* Mirrors the Apple sync's cleanup pass. Scoped to docs pages (.md/.mdx) and
* images under the directories this script owns.
*/
Tff7b72function Te6edf3pruneStaleTb4b4b4(Te6edf3expectedDocPathsTb4b4b4, Te6edf3expectedImageNamesTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3file Tff7b72of Te6edf3collectFilesTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3ext Tff7b72= Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ext Tff7b72!== Ta5d6ff".md" Tff7b72&& Te6edf3ext Tff7b72!== Ta5d6ff".mdx"Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3expectedDocPathsTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3fileTb4b4b4.Te6edf3splitTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3sepTb4b4b4)Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"/"Tb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72const Te6edf3target Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Te6edf3fileTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3DRY_RUNTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ff[dry-run] Would remove stale page: Tffd700${Te6edf3targetTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3fsTb4b4b4.Te6edf3unlinkSyncTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffRemoved stale page: Tffd700${Te6edf3targetTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3file Tff7b72of Te6edf3collectFilesTb4b4b4(Te6edf3DEST_IMAGES_DIRTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3IMAGE_EXTENSIONSTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3extnameTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3expectedImageNamesTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3basenameTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72const Te6edf3target Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_IMAGES_DIRTb4b4b4, Te6edf3fileTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3DRY_RUNTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ff[dry-run] Would remove stale image: Tffd700${Te6edf3targetTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3fsTb4b4b4.Te6edf3unlinkSyncTb4b4b4(Te6edf3targetTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffRemoved stale image: Tffd700${Te6edf3targetTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72function Te6edf3createIndexPageTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3content Tff7b72= Ta5d6ff`Ta5d6ff---
title: Android App
sidebar_position: 1
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Documentation for the [Meshtastic Android](https://github.com/meshtastic/Meshtastic-Android) application, also available as a Desktop (JVM) app for Linux, macOS, and Windows.


**[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more **[User Guide](user/)** β€” Setup, messaging, nodes, maps, settings, and more
**[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f **[Developer Guide](developer/)** β€” Architecture, KMP conventions, testing, and contributing`f
Ta5d6ff`Tb4b4b4;
Te6edf3writeFileTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Ta5d6ff"index.md"Tb4b4b4)Tb4b4b4, Te6edf3contentTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3createCategoryFilesTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Top-level section category. Uses the synced index.md as the landing page
T8b949e// (matching the Apple sync), replacing any hand-written generated-index that
T8b949e// would otherwise collide with index.md.
T8b949e// Unique `key` per category: the "User Guide" / "Developer Guide" labels also
T8b949e// exist in the Apple section, and Docusaurus derives sidebar translation keys
T8b949e// from the label, so without a key the two sections collide at build time.
Tff7b72const Te6edf3sectionCategory Tff7b72= Ta5d6ff`Ta5d6ffkey: androidApp
label: Android App
collapsible: true
position: 1
link:
type: doc
id: software/android/index
Ta5d6ff`Tb4b4b4;
Tff7b72const Te6edf3userCategory Tff7b72= Ta5d6ff`Ta5d6ffkey: androidUserGuide
label: User Guide
collapsible: true
position: 1
link:
type: doc
id: software/android/user/index
Ta5d6ff`Tb4b4b4;
Tff7b72const Te6edf3devCategory Tff7b72= Ta5d6ff`Ta5d6ffkey: androidDeveloperGuide
label: Developer Guide
collapsible: true
position: 2
link:
type: doc
id: software/android/developer/index
Ta5d6ff`Tb4b4b4;
Te6edf3writeFileTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Ta5d6ff"_category_.yml"Tb4b4b4)Tb4b4b4, Te6edf3sectionCategoryTb4b4b4)Tb4b4b4;
Te6edf3writeFileTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Ta5d6ff"user"Tb4b4b4, Ta5d6ff"_category_.yml"Tb4b4b4)Tb4b4b4, Te6edf3userCategoryTb4b4b4)Tb4b4b4;
Te6edf3writeFileTb4b4b4(Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Ta5d6ff"developer"Tb4b4b4, Ta5d6ff"_category_.yml"Tb4b4b4)Tb4b4b4, Te6edf3devCategoryTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3mainTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffSource: Tffd700${Te6edf3SRC_DOCS_DIRTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffDestination: Tffd700${Te6edf3DEST_DOCS_DIRTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffWebP conversion: Tffd700${Te6edf3CONVERT_WEBP Tff7b72? Ta5d6ff"enabled" Tff7b72: Ta5d6ff"disabled"Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff`Ta5d6ffDry run: Tffd700${Te6edf3DRY_RUNTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;

T8b949e// Track everything this run produces so stale files can be pruned afterwards.
Tff7b72const Te6edf3expectedDocPaths Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4[
Ta5d6ff"index.md"Tb4b4b4,
Ta5d6ff"_category_.yml"Tb4b4b4,
Ta5d6ff"user/_category_.yml"Tb4b4b4,
Ta5d6ff"developer/_category_.yml"Tb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;

T8b949e// Destination image names cited by the pages below; only these get published.
Tff7b72const Te6edf3referencedImages Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// Section overview pages: docs/en/user.md β†’ user/index.md and
T8b949e// docs/en/developer.md β†’ developer/index.md. Docusaurus uses <dir>/index.md
T8b949e// as the category landing page, so the index.md "User Guide" / "Developer
T8b949e// Guide" links resolve (matching the Apple sync).
Tff7b72const Te6edf3sections Tff7b72= Tb4b4b4[
Tb4b4b4{ Te6edf3srcTff7b72: Ta5d6ff"user.md"Tb4b4b4, Te6edf3destTff7b72: Tb4b4b4[Ta5d6ff"user"Tb4b4b4, Ta5d6ff"index.md"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"user"Tb4b4b4, Te6edf3keyTff7b72: Ta5d6ff"user/index.md" Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3srcTff7b72: Ta5d6ff"developer.md"Tb4b4b4, Te6edf3destTff7b72: Tb4b4b4[Ta5d6ff"developer"Tb4b4b4, Ta5d6ff"index.md"Tb4b4b4]Tb4b4b4, Te6edf3sectionTff7b72: Ta5d6ff"developer"Tb4b4b4, Te6edf3keyTff7b72: Ta5d6ff"developer/index.md" Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Tb4b4b4{ Te6edf3srcTb4b4b4, Te6edf3destTb4b4b4, Te6edf3sectionTb4b4b4, Te6edf3key Tb4b4b4} Tff7b72of Te6edf3sectionsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3overview Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3SRC_DOCS_DIRTb4b4b4, Te6edf3srcTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3overviewTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3processMarkdownTb4b4b4(Te6edf3overviewTb4b4b4, Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Tb4b4b4...Te6edf3destTb4b4b4)Tb4b4b4, Te6edf3sectionTb4b4b4, Tff7b72trueTb4b4b4, Te6edf3referencedImagesTb4b4b4)Tb4b4b4;
Te6edf3expectedDocPathsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Process user guide
Tff7b72const Te6edf3userDir Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3SRC_DOCS_DIRTb4b4b4, Ta5d6ff"user"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3userDirTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3file Tff7b72of Te6edf3fsTb4b4b4.Te6edf3readdirSyncTb4b4b4(Te6edf3userDirTb4b4b4)Tb4b4b4.Te6edf3filterTb4b4b4(Te6edf3f Tb4b4b4=> Te6edf3fTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff".md"Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3processMarkdownTb4b4b4(
Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3userDirTb4b4b4, Te6edf3fileTb4b4b4)Tb4b4b4,
Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Ta5d6ff"user"Tb4b4b4, Te6edf3fileTb4b4b4)Tb4b4b4,
Ta5d6ff"user"Tb4b4b4,
Tff7b72falseTb4b4b4,
Te6edf3referencedImagesTb4b4b4,
Tb4b4b4)Tb4b4b4;
Te6edf3expectedDocPathsTb4b4b4.Te6edf3addTb4b4b4(Ta5d6ff`Ta5d6ffuser/Tffd700${Te6edf3fileTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Process developer guide
Tff7b72const Te6edf3devDir Tff7b72= Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3SRC_DOCS_DIRTb4b4b4, Ta5d6ff"developer"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3fsTb4b4b4.Te6edf3existsSyncTb4b4b4(Te6edf3devDirTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3file Tff7b72of Te6edf3fsTb4b4b4.Te6edf3readdirSyncTb4b4b4(Te6edf3devDirTb4b4b4)Tb4b4b4.Te6edf3filterTb4b4b4(Te6edf3f Tb4b4b4=> Te6edf3fTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff".md"Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3processMarkdownTb4b4b4(
Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3devDirTb4b4b4, Te6edf3fileTb4b4b4)Tb4b4b4,
Te6edf3pathTb4b4b4.Te6edf3joinTb4b4b4(Te6edf3DEST_DOCS_DIRTb4b4b4, Ta5d6ff"developer"Tb4b4b4, Te6edf3fileTb4b4b4)Tb4b4b4,
Ta5d6ff"developer"Tb4b4b4,
Tff7b72falseTb4b4b4,
Te6edf3referencedImagesTb4b4b4,
Tb4b4b4)Tb4b4b4;
Te6edf3expectedDocPathsTb4b4b4.Te6edf3addTb4b4b4(Ta5d6ff`Ta5d6ffdeveloper/Tffd700${Te6edf3fileTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Create index and category files
Te6edf3createIndexPageTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3createCategoryFilesTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// Process images β€” only those the pages above reference.
Tff7b72const Te6edf3expectedImageNames Tff7b72= Te6edf3processImagesTb4b4b4(Te6edf3referencedImagesTb4b4b4)Tb4b4b4;

T8b949e// Remove anything left over from a previous sync or the old hand-written docs.
Te6edf3pruneStaleTb4b4b4(Te6edf3expectedDocPathsTb4b4b4, Te6edf3expectedImageNamesTb4b4b4)Tb4b4b4;

Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"\nSync complete."Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3mainTb4b4b4(Tb4b4b4)Tb4b4b4;

Served by rngit 1.4.2 - Generated in 0.13s